AWS SSM Parameter StoreのString型とStringList型はどう違う?
パラメーターを保存する AWS SSM Parameter Store はタイプとして、以下の3種類が存在します。
- String
- StringList
- SecureString
SecureString はKMSで暗号化して機密データを管理するためにあります。
ドキュメントを読んだ限りでは、残り2つの String と StringList の違いがわかりにくかったため、違いを確認しました
3行まとめ
- String も StringList も参照時の動作は同じ
- StringListの場合、更新時にセパレーター(
,
)で分けた上でバリデーション可能 - StringListの場合、AWSコンソールのテキストエリアで編集すると、改行がセパレーター(
,
)に変換される
StringListタイプはほぼStringタイプだけど一部挙動が異なる
ドキュメントから String タイプと StringList タイプの定義を確認します。
String
By default, String parameters consist of any block of text you enter. For example:
abc123
Example Corp
<img src="images/bannerImage1.png"/>
StringList
StringList parameters contain a comma-separated list of values, as shown in the following examples.
Monday,Wednesday,Friday
CSV,TSV,CLF,ELF,JSON
StringList タイプはコンマで区切られた文字列というのはわかりましたが、そのコンマ区切りの文字列を String タイプとして管理しても良さそうに思えます。
参照時には、値を文字列としてまるっと取得できるだけのため、違いはありません。 しかし、更新時には、微妙な差異があります。
コンマ分割後の文字列に対してバリデーション
パラメーターを追加・更新する場合、 SSM:PutParameter API を利用します。
このAPI には AllowedPattern
オプションがあり、値の文字列パターンをバリデートできます。
String タイプの場合、値全体に対してバリデートするのに対して、 StringList タイプの場合、コンマで分割後の各文字列に対してバリデートします。
この動作を確認します。
値は文字列だけで構成されるべき(--allowed-pattern="^\d+$
)とします。
123
を String タイプで登録します。
$ aws ssm put-parameter \ --name "foo" \ --value "123" \ --allowed-pattern="^\d+$" \ --type String \ --overwrite { "Version": 1, "Tier": "Standard" }
成功です。
数字でない文字(,
)を含んだ 123,456
を String タイプで登録します。
$ aws ssm put-parameter \ --name "foo" \ --value "123,456" \ --allowed-pattern="^\d+$" \ --type String \ --overwrite An error occurred (ParameterPatternMismatchException) when calling the PutParameter operation: Parameter value, cannot be validated against allowedPattern: ^\d+$
バリデーションに引っかかりました。
この値を StringList タイプで登録してみましょう。
$ aws ssm put-parameter \ --name "foo" \ --value "123,456" \ --allowed-pattern="^\d+$" \ --type StringList \ --overwrite { "Version": 2, "Tier": "Standard" }
登録成功です。
値 123,456
をコンマで分割し、 123
, 456
それぞれに対してバリデートしているからです。
AWS コンソール利用時は改行がコンマとして扱われる
AWSコンソールのテキストエリアで値を編集している場合は注意が必要です。
StringList タイプの場合、保存時にテキストエリアの改行が ,
に変換されます。
例えば、テキストエリアに
123 456
と入力して保存すると、123,456
として登録されます。
コンソールの編集画面で開くと、コンマが改行に変換されることなく、初期状態は文字列そのままです。
123,456
SDK を使い、改行を含んだ値を StringList タイプとして登録してみましょう。
import boto3 ssm_client = boto3.client('ssm') ssm_client.put_parameter( Name='bar', Overwrite=True, Value="123\n456", )
パラメーターの値としては 123\n456
として保存されます。
このパラメーターをコンソールの編集画面で開くと、
123 456
というようにテキストエリアに改行が反映されます。
このまま保存を実行すると、先に紹介した仕様の通り、改行がコンマに変換され、 123,456
として登録されます。
編集画面を一切弄らずに保存しただけなのに、違う値として更新されました。
最後に
AWS SSM Parameter Storeの String タイプと StringList タイプの細かすぎて伝わりにくい違いについて解説しました。
違いは以下の2点です
- StringList はコンマ分割後の文字列に対してバリデートされる
- StringList はコンソール編集時に改行がコンマに変換される
パラメーターにコンマ区切りの文字列を登録しており、バリデート機能を活用したい場合は StringList タイプ、それ以外の場合では、コンソールの編集画面と保存される値が一致する String タイプが余計な混乱を招かず向いているかもしれません。
それでは。